import os
import shutil
import time
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox


# 把一个文件夹下，包括子文件夹的所有文件都集中到目标文件夹
# 方法1：移动
# 方法2：复制
# 步骤：
# 1.获取原文件夹下所有文件到列表
# 2.建立与文件列表大小相同，以时间戳为元素的等差列表
# 3.执行临时重命名
# 4.执行序列化重命名

def get_file_in_folder(folder_path):
    file_list = []
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            file_list.append(os.path.join(root, file))
    return file_list


def create_temp_list(file_list):
    timestamp = int(time.time())
    temp_list = []
    for f in file_list:
        suffix = f.split(sep='.')[-1]
        temp_path = dst_dir + os.sep + str(timestamp) + '.' + suffix
        temp_list.append(temp_path)
        timestamp = timestamp + 1
    return temp_list


def copy_files(file_list, temp_list):
    for i in range(len(file_list)):
        src_file = file_list[i]
        dst_file = temp_list[i]
        try:
            # 复制文件
            shutil.copy2(src_file, dst_file)
            print(f"{src_file}已成功复制为{dst_file}")
        except FileNotFoundError:
            print(f"错误: 源文件 {src_file} 未找到。")
        except PermissionError:
            print("错误: 没有足够的权限进行操作。")
        except Exception as e:
            print(f"发生未知错误: {e}")


def move_files(file_list, temp_list):
    for i in range(len(file_list)):
        source_path = file_list[i]
        destination_path = temp_list[i]
        try:
            # 检查源文件是否存在
            if os.path.exists(source_path):
                # 移动文件
                shutil.move(source_path, destination_path)
                print(f"文件已成功从 {source_path} 移动到 {destination_path}")
            else:
                print(f"错误：源文件 {source_path} 不存在。")
        except PermissionError:
            print("错误：没有足够的权限进行操作。")
        except Exception as e:
            print(f"发生未知错误: {e}")


def serialize_rename_files(folder_path, start_index):
    try:
        # 获取文件夹下的所有文件
        file_list = []
        for root, dirs, files in os.walk(folder_path):
            if root == folder_path:
                for file in files:
                    file_list.append(os.path.join(root, file))

        # 对文件进行序列化重命名
        for index, file_path in enumerate(file_list, start=start_index):
            file_dir = os.path.dirname(file_path)
            file_ext = os.path.splitext(file_path)[1]
            new_file_name = f"{index}{file_ext}"
            new_file_path = os.path.join(file_dir, new_file_name)
            os.rename(file_path, new_file_path)
            print(f"已将 {file_path} 重命名为 {new_file_path}")
    except FileNotFoundError:
        print(f"错误: 文件夹 {folder_path} 未找到。")
    except PermissionError:
        print("错误: 没有足够的权限进行操作。")
    except Exception as e:
        print(f"发生未知错误: {e}")


def create_folder_os(folder_path):
    try:
        if not os.path.exists(folder_path):
            os.makedirs(folder_path)
            print(f"文件夹 {folder_path} 创建成功。")
        else:
            print(f"文件夹 {folder_path} 已存在。")
    except PermissionError:
        print("错误：没有足够的权限创建文件夹。")
    except FileExistsError:
        # 这种情况通常是由于路径中部分文件夹已存在，但整体路径不符合 makedirs 要求导致
        print(f"文件夹 {folder_path} 创建失败，可能路径存在问题。")
    except Exception as e:
        print(f"发生未知错误: {e}")


def delete_folder(folder_path):
    try:
        if os.path.exists(folder_path):
            shutil.rmtree(folder_path)
            print(f"文件夹 {folder_path} 已成功删除。")
        else:
            print(f"错误：文件夹 {folder_path} 不存在。")
    except PermissionError:
        print("错误：没有足够的权限删除文件夹。")
    except Exception as e:
        print(f"发生未知错误: {e}")


if __name__ == '__main__':
    # 创建一个空文件夹作为起始文件夹，避免用户意外结束程序
    temp_folder_path = rf'C:\{str(int(time.time()))}'
    create_folder_os(temp_folder_path)

    src_dir = temp_folder_path
    dst_dir = temp_folder_path

    # 用户选择文件夹
    messagebox.showinfo(message='选择你要整理的文件夹')
    src_dir = filedialog.askdirectory(title='选择文件夹')
    messagebox.showinfo(message='选择整理后的文件存放位置')
    dst_dir = filedialog.askdirectory(title='选择存放位置')

    delete_folder(temp_folder_path)

    # 1.获取原文件夹下所有文件到列表
    file_list = get_file_in_folder(src_dir)
    # 2.建立与文件列表大小相同，以时间戳为元素的等差列表
    temp_list = create_temp_list(file_list)
    # 3.执行临时重命名
    # 方法1：复制
    # copy_files(file_list, temp_list)
    # 方法2：移动
    move_files(file_list, temp_list)
    # 4.执行序列化重命名
    random_number = 2 * int(time.time())
    serialize_rename_files(dst_dir, random_number)
    serialize_rename_files(dst_dir, 1)
    # 5.程序完成，提示用户检查
    messagebox.showinfo(message="程序结束，请检查结果")
